﻿// Copyright (c) 2012 - 2021 Jared Zheng <jaredz at outlook dot com>
// Buddha Framework is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//          http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
//
// Create : 2012-12-01 version 0.1 Jared Zheng <jaredz at outlook dot com>
// Update : 2021-03-19 version 4.0.0 Jared Zheng <jaredz at outlook dot com>

#ifndef __COMMON_DEFINE_H__
#define __COMMON_DEFINE_H__

#pragma once

#include "networkevent.h"

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// server uuid : 服务UUID定义
DECLARE_UUID( IMasterServer, {7D22C136-25BA-4FF0-98B8-9BFE5298060B} )
DECLARE_UUID( ISlaveServer,  {9A99E1B8-199A-415B-9A78-D35C5BB12938} )
DECLARE_UUID( INodeServer,   {87E0D393-1412-422A-AE7C-2033C986882E} )

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// check uuid : 检测UUID定义(Windows)
DECLARE_UUID( KeepAlive,     {199FDABE-1BBC-44C0-951B-DDB507BB8C58} ) // 服务模式监听守护进程的信号, 如果无信号停止退出
DECLARE_UUID( MayDay,        {AAF622E7-3AB1-4D4D-A5A7-5650BD4ED1D1} ) // 守护进程定时遍历所有服务进程信号UUID_PID, 有对应信号的结束进程再重启相应的服务
DECLARE_UUID( WarnLoad,      {A27D0C32-8A3D-4CFA-AD07-2510FF8BB5E6} ) // 守护进程定时遍历所有服务进程信号UUID_PID, 有对应信号的超过预计时间则结束进程再重启相应的服务
DECLARE_UUID( OverLoad,      {6B35C191-72CE-4AB9-928E-77F12498DC0B} ) // 守护进程定时检测广域网ping值, 多次超时无响应设置ping值异常状态
DECLARE_UUID( BusyLoad,      {8176595D-F481-423E-9EB1-87C9B4253C07} ) // 守护进程定时检测广域网ping值, 多次延时响应>100ms设置ping值延迟状态

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 通用常量定义
enum COMMON_CONST_ENUM
{
    // 检测网络工作线程, 异步事件队列和定时器线程的超时倍数
#ifdef __RUNTIME_DEBUG__
    COMMONC_CHECK     = 100,
#else
    COMMONC_CHECK     = 2,
#endif
    COMMONC_TOPERCENT = 400,    // 万分比转换成百分比
    COMMONC_RATE_LOAD = 400,    // 负载默认变化比率(万分比)
    COMMONC_BUSY_LOAD = 32000,  // 服务繁忙(万分比)
    COMMONC_FULL_LOAD = 40000,  // 服务满载(万分比)
    COMMONC_OVER_LOAD = 48000,  // 服务超载/无效(万分比)
    COMMONC_WARN_LOAD = 56000,  // 服务告警
    COMMONC_MAY_DAY   = 64000,  // 服务异常
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务类型
enum COMMON_TYPE_ENUM
{
    COMMONT_NONE      = 0x0,
    COMMONT_MASTER    = 0x1,
    COMMONT_SLAVE     = 0x2,
    COMMONT_NODE      = 0x4,
    COMMONT_ALL       = 0x7,
    COMMONT_MASK      = 0x8,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务层级 : 服务信息的同步是按层级从小向大的同步
// 1. Slave和Node必须有层级编号, 所有编号必须唯一不可重复
// 2. Slave必须链接Master服务
// 3. Node必须链接Master或者Slave服务
enum COMMON_RANK_ENUM
{
    COMMONR_MASTER    = 0,
    COMMONR_MIN,
    COMMONR_MAX       = 8, // 预留最多7种不同的服务层级
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务运行状态
enum SERVER_STATUS_ENUM
{
    SERVERS_NONE      = 0, // 无状态
    SERVERS_INIT,          // 初始状态
    SERVERS_RUN,           // 运行状态
    SERVERS_BUSY,          // 繁忙状态
    SERVERS_FULL,          // 满载状态
    SERVERS_OVER,          // 超载状态
    SERVERS_ERROR,         // 异常状态
    SERVERS_UNLINK,        // 注销状态
    SERVERS_STOP,          // 停止状态
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务注册状态
enum SERVER_LINK_ENUM
{
    SERVERL_NONE      = 0,
    SERVERL_READY     = 4,
    SERVERL_CNNTING   = 8,  // 连接状态每次更新都自减1, 到SERVERL_READY重新开始连接
    SERVERL_CNNTED    = 12,
    SERVERL_LINKING   = 16, // 注册状态每次更新都自减1, 到SERVERL_CNNTED重新开始注册
    SERVERL_LINKED    = 20,
    SERVERL_RESERVED  = 24,
    SERVERL_FAILED    = 28,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务更新状态
enum SERVER_UPDATE_ENUM
{
    SERVERU_NONE      = 0x0000, // 初始状态
    SERVERU_LINK      = 0x0001, // 注册数据状态
    SERVERU_OKAY      = 0x0002, // 数据处理完成状态
    SERVERU_SYNC      = 0x0004, // 需要同步更新状态
    SERVERU_UNLINK    = 0x0008, // 注销状态

    SERVERU_UPDATE    = 0x0010, // 接收方同步数据时直接变成完成状态

    SERVERU_STRADDR   = 0x0100,
    SERVERU_ROUTINE   = 0x0200,
    SERVERU_SYNCMASK  = 0x0400,

    SERVERU_XLINKSYNC = (SERVERU_LINK|SERVERU_SYNC|SERVERU_UNLINK),      // 状态组合1
    SERVERU_OKAYSYNC  = (SERVERU_OKAY|SERVERU_SYNC),                     // 状态组合2
    SERVERU_INFO      = (SERVERU_STRADDR|SERVERU_ROUTINE),               // 状态组合3

    SERVERU_SYNC_ALL  = (SERVERU_XLINKSYNC|SERVERU_INFO),
    SERVERU_OKAY_ALL  = (SERVERU_OKAYSYNC|SERVERU_INFO),

    SERVERU_SYNC_ADDR = (SERVERU_XLINKSYNC|SERVERU_STRADDR),
    SERVERU_OKAY_ADDR = (SERVERU_OKAYSYNC|SERVERU_STRADDR),

    SERVERU_SYNC_RTN  = (SERVERU_XLINKSYNC|SERVERU_ROUTINE),
    SERVERU_OKAY_RTN  = (SERVERU_OKAYSYNC|SERVERU_ROUTINE),
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 各服务信令定义范围
enum PAK_EVENT_ENUM
{
    // CNETHead
    PAKE_BASE_BEGIN   = 1000, //(CNETTraits::EVENT_RESERVED + 900),
    PAKE_BASE_END     = 1999,
    // CNETID
    PAKE_ID_BEGIN     = 2000,
    PAKE_ID_END       = 9999,
    // CNETSRV
    PAKE_SRV_BEGIN    = 10000,
    PAKE_SRV_END      = 64000,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 数据包头部类型
typedef UShort                       UEVENT;
typedef UShort                       URANK;
typedef UShort                       USID;
typedef UShort                       UDATA;

typedef CNETTraits::Socket           Socket_t;
typedef CNETTraits::STR_ADDR         CStrAddr;
typedef CNETTraits::NET_ADDR         CNetAddr;
typedef CNETTraits::NET_PARAM        CNetParam;
typedef CNETTraits::ADDR_PARAM       CAddrParam;
typedef CNETTraits::CStreamScopePtr  CNetStreamPtr;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 服务信息结构定义 : 信息统计使用
struct tagSERVER_STATUS : public MObject
{
public:
    tagSERVER_STATUS(void)
    : uTotal(0)
    , uOnline(0)
    , usLoad(0)
    , usRate(0)
    , usId(0)
    , usUpdate(0)
    {
    }

    ~tagSERVER_STATUS(void)
    {
    }
public:
    UInt     uTotal;     // 连接数量
    UInt     uOnline;    // 有效数量
    UShort   usLoad;     // 服务负载情况(万分比)
    UShort   usRate;     // 负载变化比率(万分比)
    UShort   usId;       // 服务Id, 可以用来索引名称或者区分服务类型, 也可以用来物理地址划分
    UShort   usUpdate;   // 服务数据更新状态SERVER_UPDATE_ENUM
};
typedef struct tagSERVER_STATUS   SERVER_STATUS, *PSERVER_STATUS;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务信息配置结构定义
struct tagSERVER_CONFIG : public MObject
{
public:
    tagSERVER_CONFIG(void)
    : usType((UShort)COMMONT_NONE)
    , usSync((UShort)COMMONR_MASTER)
    , usId(0)
    , usQueue(0)
    , usLoad(0)
    , usRate((UShort)COMMONC_RATE_LOAD)
    {
    }

    ~tagSERVER_CONFIG(void)
    {
    }
public:
    UShort     usType;                  // 服务类型
    UShort     usSync;                  // 同步信息的服务层级(默认从链接的master同步)
    UShort     usId;                    // 服务Id
    UShort     usQueue;                 // 队列线程数量
    UShort     usLoad;                  // 初始负载
    UShort     usRate;                  // 负载变化比率
    CString    strName;                 // 服务名称
    CString    strRoutine;              // 业务实现类名或者业务名称
    CString    strInst;                 // 业务实现类实例名称
    CString    strModule;               // 业务实现类模块路径
    CStrAddr   Listen;                  // 监听地址(master/slave)
    CStrAddr   Connect[COMMONR_MAX];    // 连接master/slave服务绑定的本地地址
};
typedef struct tagSERVER_CONFIG SERVER_CONFIG, *PSERVER_CONFIG;

#endif // __COMMON_DEFINE_H__
